1 : <?php
2 : /*--------------------------------------------------------------------------+
3 : This file is part of eStudy.
4 : ressourcen/classes/class.filemanager.inc.php
5 : - Modulgruppe: File Manager
6 : - Beschreibung: Neuer, revolutionaerer File Manager
7 : - Version: 0.4, 25/09/05
8 : - Autor(en): Thorsten Buss <admin@drstone.de>
9 : Michael Plefka <freAk0r@gmx.net>
10 : +---------------------------------------------------------------------------+
11 : This program is free software; you can redistribute it and/or
12 : modify it under the terms of the GNU General Public License
13 : as published by the Free Software Foundation; either version 2
14 : of the License, or any later version.
15 : +---------------------------------------------------------------------------+
16 : This program is distributed in the hope that it will be useful,
17 : but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : GNU General Public License for more details.
20 : You should have received a copy of the GNU General Public License
21 : along with this program; if not, write to the Free Software
22 : Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 : +--------------------------------------------------------------------------*/
24 :
25 : if (!defined("PATH_TO_ROOT")) {
26 : define("PATH_TO_ROOT", "../../");
27 : }
28 :
29 : /**
30 : * File Manager
31 : * @package eStudy.Ressourcen
32 : * @version 0.4, 12/08/06
33 : * @author Thorsten Buss <admin@drstone.de>
34 : * @author Michael Plefka <freAk0r@gmx.net>
35 : * @author Corinna Kropf <corinna_kropf@web.de>
36 : */
37 : /** Einbinden der Formatierungs Klasse */
38 : require_once (PATH_TO_ROOT."common/classes/class.format.inc.php");
39 : require_once (PATH_TO_ROOT."roleplay/classes/class.roleartefacts.inc.php");
40 : require_once (PATH_TO_ROOT."teams/classes/class.teamartefacts.inc.php");
41 :
42 : /** Die Spider-Klasse der Suchmaschine einbinden */
43 : require_once (PATH_TO_ROOT."suchmaschine/classes/class.spider.inc.php");
44 :
45 : require_once (PATH_TO_ROOT."ressourcen/classes/filemanager/class.folder.inc.php");
46 : require_once (PATH_TO_ROOT."ressourcen/classes/filemanager/class.file.inc.php");
47 :
48 : require_once (PATH_TO_ROOT."ressourcen/classes/archiver/class.zipprovider.inc.php");
49 : require_once (PATH_TO_ROOT."ressourcen/classes/archiver/class.archiverexception.inc.php");
50 :
51 : /**
52 : * File Manager
53 : * @package eStudy.Ressourcen
54 : * @version 0.3, 25/09/05
55 : * @author Thorsten Buss <admin@drstone.de>
56 : * @author Michael Plefka <freAk0r@gmx.net>
57 : */
58 : class Filemanager {
59 : private $mimeTypes = array();
60 : private $imgFolder;
61 : private $activeFolder;
62 : private $action;
63 : private $actionID;
64 : private $visibleFiles;
65 : /**
66 : * Konstruktor
67 : *
68 : * @access public
69 : */
70 : public function __construct() {
71 0 : global $db, $resDB;
72 0 : $this->imgFolder = PATH_TO_ROOT.'ressourcen/icons/';
73 : // Liste mit Mimetypen f�llen
74 0 : $this->mimeTypes = array(
75 0 : 'ez' => 'application/andrew-inset', 'hqx' => 'application/mac-binhex40',
76 0 : 'cpt' => 'application/mac-compactpro', 'doc' => 'application/msword',
77 0 : 'bin' => 'application/octet-stream', 'dms' => 'application/octet-stream',
78 0 : 'lha' => 'application/octet-stream', 'lzh' => 'application/octet-stream',
79 0 : 'exe' => 'application/octet-stream', 'class' => 'application/octet-stream',
80 0 : 'so' => 'application/octet-stream', 'dll' => 'application/octet-stream',
81 0 : 'oda' => 'application/oda', 'pdf' => 'application/pdf', 'ai' => 'application/postscript',
82 0 : 'eps' => 'application/postscript', 'ps' => 'application/postscript',
83 0 : 'smi' => 'application/smil', 'smil' => 'application/smil', 'mif' => 'application/vnd.mif',
84 0 : 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint',
85 0 : 'wbxml' => 'application/vnd.wap.wbxml', 'wmlc' => 'application/vnd.wap.wmlc',
86 0 : 'wmlsc' => 'application/vnd.wap.wmlscriptc', 'bcpio' => 'application/x-bcpio',
87 0 : 'vcd' => 'application/x-cdlink', 'pgn' => 'application/x-chess-pgn', 'cpio' => 'application/x-cpio',
88 0 : 'csh' => 'application/x-csh', 'dcr' => 'application/x-director', 'dir' => 'application/x-director',
89 0 : 'dxr' => 'application/x-director', 'dvi' => 'application/x-dvi', 'spl' => 'application/x-futuresplash',
90 0 : 'gtar' => 'application/x-gtar', 'hdf' => 'application/x-hdf', 'js' => 'application/x-javascript',
91 0 : 'skp' => 'application/x-koan', 'skd' => 'application/x-koan', 'skt' => 'application/x-koan',
92 0 : 'skm' => 'application/x-koan', 'latex' => 'application/x-latex', 'nc' => 'application/x-netcdf',
93 0 : 'cdf' => 'application/x-netcdf', 'sh' => 'application/x-sh', 'shar' => 'application/x-shar',
94 0 : 'swf' => 'application/x-shockwave-flash', 'sit' => 'application/x-stuffit',
95 0 : 'sv4cpio' => 'application/x-sv4cpio', 'sv4crc' => 'application/x-sv4crc', 'tar' => 'application/x-tar',
96 0 : 'tcl' => 'application/x-tcl', 'tex' => 'application/x-tex', 'texinfo' => 'application/x-texinfo',
97 0 : 'texi' => 'application/x-texinfo', 't' => 'application/x-troff', 'tr' => 'application/x-troff',
98 0 : 'roff' => 'application/x-troff', 'man' => 'application/x-troff-man', 'me' => 'application/x-troff-me',
99 0 : 'ms' => 'application/x-troff-ms', 'ustar' => 'application/x-ustar', 'src' => 'application/x-wais-source',
100 0 : 'xhtml' => 'application/xhtml+xml', 'xht' => 'application/xhtml+xml', 'zip' => 'application/zip',
101 0 : 'au' => 'audio/basic', 'snd' => 'audio/basic', 'mid' => 'audio/midi', 'midi' => 'audio/midi',
102 0 : 'kar' => 'audio/midi', 'mpga' => 'audio/mpeg', 'mp2' => 'audio/mpeg', 'mp3' => 'audio/mpeg',
103 0 : 'aif' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'm3u' => 'audio/x-mpegurl',
104 0 : 'ram' => 'audio/x-pn-realaudio', 'rm' => 'audio/x-pn-realaudio', 'rpm' => 'audio/x-pn-realaudio-plugin',
105 0 : 'ra' => 'audio/x-realaudio', 'wav' => 'audio/x-wav', 'pdb' => 'chemical/x-pdb',
106 0 : 'xyz' => 'chemical/x-xyz', 'bmp' => 'image/bmp', 'gif' => 'image/gif', 'ief' => 'image/ief',
107 0 : 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'jpe' => 'image/jpeg', 'png' => 'image/png',
108 0 : 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'djvu' => 'image/vnd.djvu', 'djv' => 'image/vnd.djvu',
109 0 : 'wbmp' => 'image/vnd.wap.wbmp', 'ras' => 'image/x-cmu-raster', 'pnm' => 'image/x-portable-anymap',
110 0 : 'pbm' => 'image/x-portable-bitmap', 'pgm' => 'image/x-portable-graymap', 'ppm' => 'image/x-portable-pixmap',
111 0 : 'rgb' => 'image/x-rgb', 'xbm' => 'image/x-xbitmap', 'xpm' => 'image/x-xpixmap',
112 0 : 'xwd' => 'image/x-xwindowdump', 'igs' => 'model/iges', 'iges' => 'model/iges', 'msh' => 'model/mesh',
113 0 : 'mesh' => 'model/mesh', 'silo' => 'model/mesh', 'wrl' => 'model/vrml', 'vrml' => 'model/vrml',
114 0 : 'css' => 'text/css', 'html' => 'text/html', 'htm' => 'text/html', 'asc' => 'text/plain',
115 0 : 'txt' => 'text/plain', 'rtx' => 'text/richtext', 'rtf' => 'text/rtf', 'sgml' => 'text/sgml',
116 0 : 'sgm' => 'text/sgml', 'tsv' => 'text/tab-separated-values', 'wml' => 'text/vnd.wap.wml',
117 0 : 'wmls' => 'text/vnd.wap.wmlscript', 'etx' => 'text/x-setext', 'xsl' => 'text/xml',
118 0 : 'xml' => 'text/xml', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpe' => 'video/mpeg',
119 0 : 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', 'mxu' => 'video/vnd.mpegurl',
120 0 : 'avi' => 'video/x-msvideo', 'movie' => 'video/x-sgi-movie', 'ice' => 'x-conference/x-cooltalk',);
121 0 : $this->activeFolder = isset($_GET['activeFolder']) ? $_GET['activeFolder'] : 0;
122 0 : $this->action = isset($_GET['action']) ? $_GET['action'] : '';
123 0 : $this->actionID = isset($_GET['actionID']) ? $_GET['actionID'] : 0;
124 0 : $this->visibleFiles = $db->get_col("SELECT fileID FROM filevisible WHERE userID='".$_SESSION["userid"]."'");
125 0 : $resDB = new RessourcenDB( $this );
126 0 : }
127 :
128 : public function getActiveFolder() {
129 0 : return $this->activeFolder;
130 : }
131 :
132 : public function getAction() {
133 0 : return $this->action;
134 : }
135 :
136 : public function getActionID() {
137 0 : return $this->actionID;
138 : }
139 :
140 : public function getImgFolder() {
141 0 : return $this->imgFolder;
142 : }
143 :
144 : /**
145 : * Erstellt den Verzeichnisbaum und gibt ihn aus
146 : *
147 : * @access public
148 : */
149 : public function showTree() {
150 0 : global $db;
151 0 : $template = new Template( PATH_TO_ROOT . "/ressourcen/templates/foldertree.html" );
152 0 : $treeEntries = "";
153 :
154 : //Bestimmung der Anzeigeoptionen fuer spezielle User
155 : // INIT
156 0 : $course = $_SESSION['course'];
157 : // Setzt Standards fuer die Symbole
158 0 : $plus = 8;
159 0 : $minus = 6;
160 0 : $join = 3;
161 0 : $bottom = false;
162 : // MostDownloaded Files
163 0 : $lastTwenty = new Folder(-2);
164 0 : $lastTwenty->setLink("Last 20");
165 0 : $lastTwenty->setName("Die 20 neuesten Dateien dieses Kurses.");
166 0 : $lastTwenty->setFolderType(13);
167 0 : $lastTwenty->setLayerType(5);
168 0 : $treeEntries .= $lastTwenty->drawFolder("", false);
169 :
170 0 : $lastTwenty = new Folder(-1);
171 0 : $lastTwenty->setLink("Top 20");
172 0 : $lastTwenty->setName("Die 20 beliebtesten Dateien dieses Kurses.");
173 0 : $lastTwenty->setFolderType(12);
174 0 : $lastTwenty->setLayerType(5);
175 0 : $treeEntries .= $lastTwenty->drawFolder("", false);
176 :
177 0 : $mainFolder = new Folder();
178 0 : $mainFolder->setFileManager($this);
179 0 : if ($return = $mainFolder->printSubFolder()) {
180 0 : $treeEntries .= $return;
181 0 : } else {
182 0 : $treeEntries .= "<span class='tableCell'>Noch keine Ordner angelegt.</span>";
183 : }
184 0 : eval ( $template->getTemplate() );
185 0 : }
186 :
187 : public function showFiles( $statisticView = false ) {
188 0 : global $resDB;
189 0 : if ($this->activeFolder > 0) {
190 0 : $folder = $resDB->getFolderByID($this->activeFolder);
191 : //Nicht berechtigte Usergruppen dürfen den Ordner und seinen Inhalt nicht sehen
192 : //oder downloaden, auch nicht durch explizite Angabe des Links
193 0 : if (!$folder || !$this->canSeeFile($this->activeFolder))
194 0 : {
195 0 : return "Keine solche Ressource verfügbar!";
196 : }
197 0 : } else {
198 0 : if ($this->activeFolder == -1) {
199 0 : $folder = new Folder(-1);
200 0 : $folder->setFileManager($this);
201 0 : $folder->setLink("Top 20");
202 0 : }
203 0 : if ($this->activeFolder == -2) {
204 0 : $folder = new Folder(-2);
205 0 : $folder->setFileManager($this);
206 0 : $folder->setLink("20 neuesten Ressourcen");
207 0 : }
208 : }
209 :
210 0 : $folder->showFiles($statisticView);
211 0 : }
212 :
213 : public function showFilesForRootFolder( $statisticView = false ) {
214 0 : global $resDB;
215 0 : global $visibleTxt;
216 0 : $folder = new Folder();
217 0 : $folder->setFileManager($this);
218 0 : $folder->setFiles($resDB->getFiles(0));
219 0 : $folder->loadSubFolder();
220 0 : $linkCounter = $fileCounter = $sizeCounter = 0;
221 0 : foreach($folder->getFiles() as $file) {
222 0 : if ($file->isFileVisible()) {
223 0 : if ($file->getType() == 'link') $linkCounter++;
224 0 : elseif ($file->getType() == 'file') $fileCounter++;
225 0 : $sizeCounter = $sizeCounter+$file->getSize();
226 0 : }
227 0 : }
228 0 : $sizeCounter = Format::FilesizeStr($sizeCounter);
229 0 : $folder->setFileCounter($fileCounter);
230 0 : $folder->setLinkCounter($linkCounter);
231 :
232 : // Root-Ordner ist immer für alle sichtbar
233 0 : $folder->setVisibleType(1);
234 0 : $visible = $visibleTxt[1];
235 :
236 0 : $folderIcons = (!$statisticView) ? $folder->getUserIcons() : "";
237 : // Blaue Ueberschrift
238 0 : $folderInfo = ($fileCounter+$linkCounter) .
239 0 : " Element".(($fileCounter+$linkCounter) != 1 ? "e" : "") .
240 0 : ", Ordner ".$visible;
241 0 : echo "<div class='res_filelist_header tableCellHead' style='overflow: hidden;'>
242 : <div class='res_folder_title'><div>Ordner: Hauptordner<span class='res_folderinfo'>
243 0 : ($folderInfo) -> Size: $sizeCounter</span></div></div>
244 0 : <div class='res_folder_icons'><div>$folderIcons</div></div>";
245 0 : echo "</div>";
246 0 : }
247 :
248 : /**
249 : * Führt eine Aktion aus, die vom User ausgewählt wurde.
250 : *
251 : * @param object [$file] details der aktuellen Datei, oder folderID
252 : * @param int [$cols] Anzahl der Spalten der Filelist, wird fuer Colspan benoetigt
253 : * @param string $action Durchzuführende Aktion, fehlt diese Angabe, wird der GET-Parameter verwendet
254 : * @param int $actionID ID des Objekts, auf das die Aktion angewandt werden soll,
255 : * fehlt diese Angabe, wird der GET-Parameter verwendet
256 : * @param int $activeFolder ID des aktuellen Verzeichnisses, fehlt diese Angabe, wird der GET-Parameter verwendet
257 : * @access public
258 : */
259 : public function runAction($file, $cols, $action = "", $actionID = "", $activeFolder = "") {
260 0 : global $db;
261 0 : if (empty($activeFolder)) $activeFolder = $_GET['activeFolder'];
262 0 : if (empty($action)) $action = isset($_GET['action']) ? $_GET['action'] : '';
263 0 : if (empty($actionID)) $actionID = isset($_GET['actionID']) ? $_GET['actionID'] : '';
264 0 : if (!$action || (is_object($file) && $file->fileID != $actionID)
265 0 : || (!is_object($file) && $file != $actionID)) return false;
266 : switch ($action) {
267 0 : case 'delete_trueFile':
268 0 : if ($_SESSION['userid'] == $file->userID
269 0 : || $_SESSION['usergroup'] == ADMIN
270 0 : || ($_SESSION["usergroup"] == DOZENT
271 0 : && $_SESSION["course"] > 0)) {
272 0 : if ($file->type == 'file') { // Wenn Datei dann loeschen
273 0 : $this->deleteFile($file->link);
274 : // Datei aus Suchmaschinen-Index löschen
275 0 : $spider = new Spider();
276 0 : $spider->start("remove-file", $file->fileID);
277 0 : }
278 0 : $db->query("DELETE FROM filelist WHERE fileID='$file->fileID'");
279 0 : $db->query("DELETE FROM filelog WHERE fileID='$file->fileID'");
280 0 : $db->query("DELETE FROM filevisible WHERE fileID='$file->fileID'");
281 0 : RoleArtefacts::deleteItem(RESSOURCE, (int)$file->fileID);
282 0 : TeamArtefacts::deleteItem(RESSOURCE, (int)$file->fileID);
283 0 : } else {
284 0 : return "Zugriff verweigert!";
285 : }
286 0 : break;
287 :
288 0 : case 'delete_trueFolder':
289 0 : if ($_SESSION['usergroup'] == ADMIN || ($_SESSION["usergroup"] == DOZENT && $_SESSION["course"] > 0)) {
290 0 : $this->deleteFolder($activeFolder);
291 0 : unset($_GET['activeFolder']);
292 0 : } else {
293 0 : return "Zugriff verweigert!";
294 : }
295 0 : break;
296 :
297 :
298 0 : case 'editFolder':
299 0 : break;
300 :
301 0 : case 'studentWriteFolder':
302 0 : if ($_SESSION['usergroup'] != 2) {
303 0 : $writeState = $db->get_var("SELECT student_write FROM filelist WHERE fileID='$actionID' ");
304 0 : $writeState = ($writeState == 1 ? 0 : 1);
305 0 : $db->query("UPDATE filelist SET student_write='$writeState' WHERE fileID='$actionID'");
306 0 : } else {
307 0 : echo "<tr><td class='res_file-extra' colspan='".$cols."'>Zugriff verweigert!</td>";
308 : }
309 0 : break;
310 :
311 0 : case 'setVisibilityDocentsOnly':
312 0 : if (isset($_GET['mode'])) $this->setRessourceVisibility($actionID, 3, $_GET['mode']);
313 0 : else $this->setRessourceVisibility($actionID, 3, 1);
314 0 : header('Location: filemanager.php?activeFolder='.$activeFolder);
315 0 : break;
316 :
317 0 : case 'setVisibilityNoStudents':
318 0 : if (isset($_GET['mode'])) $this->setRessourceVisibility($actionID, 2, $_GET['mode']);
319 0 : else $this->setRessourceVisibility($actionID, 2, 1);
320 0 : header('Location: filemanager.php?activeFolder='.$activeFolder);
321 0 : break;
322 :
323 0 : case 'setVisibilityAll':
324 0 : if (isset($_GET['mode'])) $this->setRessourceVisibility($actionID, 1, $_GET['mode']);
325 0 : else $this->setRessourceVisibility($actionID, 1, 1);
326 0 : header('Location: filemanager.php?activeFolder='.$activeFolder);
327 0 : break;
328 : }
329 0 : }
330 :
331 : /**
332 : * Löscht einen Ordner mit allem Inhalt und Unterordnern
333 : *
334 : * @param int [$folderID] ID des zu loeschenden Ordners
335 : * @return boolean Erfolgswert
336 : * @access private
337 : */
338 : private function deleteFolder($folderID) {
339 0 : global $db, $EZSQL_ERROR;
340 0 : $folders = $db->get_results("SELECT type, fileID, link FROM filelist WHERE parent_object='$folderID'");
341 0 : if ($folders) {
342 0 : foreach($folders as $folder) {
343 0 : if ($folder->type == "file") {
344 0 : $this->deleteFile($folder->link);
345 : // Datei aus Suchmaschinen-Index löschen
346 0 : $spider = new Spider();
347 0 : $spider->start("remove-file", $folder->fileID);
348 0 : }
349 0 : $this->deleteFolder($folder->fileID);
350 0 : }
351 0 : }
352 0 : $errorCount = count($EZSQL_ERROR);
353 0 : $db->query("DELETE FROM filelist WHERE fileID='$folderID'");
354 0 : $db->query("DELETE FROM filelog WHERE fileID='$folderID'");
355 0 : $db->query("DELETE FROM filetreelayout WHERE folderID='$folderID'");
356 0 : $db->query("DELETE FROM filevisible WHERE fileID='$folderID'");
357 0 : RoleArtefacts::deleteItem(RESSOURCE, (int)$folderID);
358 0 : TeamArtefacts::deleteItem(RESSOURCE, (int)$folderID);
359 0 : if (count($EZSQL_ERROR) > $errorCount) return false;
360 0 : return true;
361 : }
362 : /**
363 : * Löscht eine Datei physikalisch
364 : *
365 : * @param string [$file] Dateiname der Datei
366 : * @return boolean Erfolgswert
367 : * @access private
368 : */
369 : private function deleteFile($file) {
370 0 : global $settings;
371 0 : $basedir = PATH_TO_ROOT.$settings["upload_path"].'filemanager/courseID/'.$_SESSION['course'];
372 0 : if (!file_exists($basedir."/".$file)) return false;
373 0 : if (!unlink($basedir."/".$file)) return false;
374 0 : return true;
375 : }
376 : /*
377 : * Ändert die Sichtbarkeit der Ressource (Order, Datei oder Link)
378 : *
379 : * @param string [$ressourceID] Name der Ressource
380 : * @param int [$visibilityToSet] neuer Wert für die Sichbarkeit der Ressource
381 : * @param int [$contentRecursive]
382 : * 1 wenn nur die Ressource geändert werden soll (Ordner werden dann wie Dateien und Links behandelt)
383 : * 2 wenn bei einem Ordner nur der Inhalt (rekursiv) geändert werden soll,
384 : * 3 wenn Ordner und Inhalt (rekursiv) geändert werden sollen,
385 : * @return boolean Erfolgswert
386 : * @access private
387 : */
388 : private function setRessourceVisibility($ressourceID, $visibilityToSet, $contentRecursive) {
389 0 : global $db, $EZSQL_ERROR;
390 : // Momentane Sichtbarkeit der Ressource aus der DB auslesen
391 0 : $visible = $db->get_var("SELECT visible_type FROM filelist WHERE fileID='$ressourceID'");
392 : // Ressource hat schon die gewünschte Sichtbarkeit
393 0 : if ($visible == $visibilityToSet && $contentRecursive == 1) return true;
394 : // Wenn die Ressource ein Ordner ist und dessen Sichtbarkeit eingeschränkt werden soll:
395 : // Sichtbarkeit untergeordneter Ordner, Dateien und Links ändern
396 0 : if ($contentRecursive > 1) {
397 0 : $ressources = $db->get_results(
398 0 : "SELECT type, fileID, link , visible_type FROM filelist WHERE parent_object='$ressourceID'"
399 0 : );
400 0 : if ($ressources != null) {
401 : // Sichtbarkeit der untergeordneten Ressource nur ändern,
402 : // wenn sie eingeschränkt werden soll; Alle Unterordner durchgehen
403 0 : foreach($ressources as $ressource) {
404 : //für alle Dateien und Links in dem Ordner
405 0 : if ($ressource->type == "file") {
406 0 : $this->setRessourceVisibility($ressource->link, $visibilityToSet, $contentRecursive);
407 0 : }
408 : //für den Ordner selbst, alle Unterordner und deren Inhalt
409 0 : if ($contentRecursive == 2) {
410 0 : $this->setRessourceVisibility($ressource->fileID, $visibilityToSet, 4);
411 0 : } else {
412 0 : $this->setRessourceVisibility($ressource->fileID, $visibilityToSet, $contentRecursive);
413 : }
414 0 : }
415 0 : }
416 0 : }
417 : //Ressource mit ID $ressourceID in der DB ändern
418 0 : if ($contentRecursive != 2) {
419 : // Sichtbarkeitswerte für die Ressource auf der Datenbank updaten
420 0 : $errorCount = count($EZSQL_ERROR);
421 0 : $db->query("UPDATE filelist SET visible_type ='$visibilityToSet' WHERE fileID='$ressourceID'");
422 0 : $visible = $db->get_var("SELECT visible_type FROM filelist WHERE fileID='$ressourceID'");
423 0 : if (count($EZSQL_ERROR) > $errorCount) return false;
424 0 : if ($contentRecursive > 2) {
425 0 : $db->query("DELETE FROM filevisible WHERE fileID='".$ressourceID."'");
426 0 : }
427 0 : }
428 0 : return true;
429 : }
430 : /**
431 : * Erstellt einen Link mit GET Variablen
432 : *
433 : * @param bool [$oldOnes] Gibt an ob bisher existierende GET Variablen
434 : * mit in den Link eingebaut werden.
435 : * @param array [$vars] Ein Array (Aufbau wie $_GET) mit den Variabeln
436 : * und WErten die in den Link eingebaut werden
437 : * @param string [$link] Falls nicht PHP_SELF das Ziel ist muss hier der
438 : * Dateiname angegeben werden.
439 : * @return string Zusammengesetzter Link
440 : * @access public
441 : */
442 : public function createLink($oldOnes = true, $vars = '', $link = '') {
443 0 : if ($link == "") $link = PATH_TO_ROOT.SCRIPT_NAME;
444 0 : if (!is_array($vars)) $vars = $_GET;
445 0 : elseif (count($_GET) > 0 && $oldOnes) $vars = array_merge($_GET, $vars);
446 0 : foreach($vars as $getVarName => $getVarValue) {
447 0 : if (trim($getVarValue) != "" && isset($getVarValue))
448 0 : $getVars[] = urlencode($getVarName) ."=".urlencode($getVarValue);
449 0 : }
450 0 : return $link."?".implode($getVars, "&");
451 : }
452 : /**
453 : * Schickt eine auf dem Server liegende Datei an den Browser
454 : *
455 : * @param int [$fileID] Die ID des zu sendenden Files
456 : * @return string Zusammengesetzter Link
457 : * @access public
458 : */
459 : public function downloadFile($fileID) {
460 0 : global $settings, $db;
461 : // Dateiname generieren
462 0 : $file = $db->get_row(
463 : "SELECT name, link, size, extension, orig_filename,
464 0 : courseID FROM filelist WHERE fileID='".$fileID."'"
465 0 : );
466 0 : if (!$this->canSeeFile($fileID)) {
467 0 : return "Sie haben keine Berechtigung diese Datei herunterzuladen!";
468 : }
469 : // Verzeichnis dass die hochgeladenen Dateien enthält
470 0 : $basedir = PATH_TO_ROOT.$settings["upload_path"].'filemanager/courseID/'.$file->courseID;
471 :
472 : //die datei wie sie auf dem server liegt (der dateiname ist verschlüsselt)
473 0 : $filename = sprintf("%s/%s", $basedir, $file->link);
474 0 : if (!file_exists($filename))
475 0 : return "Datei nicht vorhanden, bitte wenden Sie sich an den Administrator!";
476 : //den mimetypen bestimmen
477 0 : if (isset($this->mimeTypes[$file->extension])) {
478 0 : $mimetype = $this->mimeTypes[$file->extension];
479 0 : } else {
480 0 : $mimetype = "application/octet-stream";
481 : }
482 : // Zugriff wird geloggt
483 0 : $time = time();
484 0 : $db->query(
485 : "INSERT INTO filelog (userID, fileID, date) VALUES ('".
486 0 : $_SESSION['userid']."','$fileID','$time')"
487 0 : );
488 0 : $db->query("UPDATE filelist SET counter=counter+1 WHERE fileID='$fileID'");
489 : // Output-Buffering abschalten
490 0 : ob_end_clean();
491 : // HTTP Header Informationen senden, die ersten beiden sind wichtig für den IE
492 0 : header("Pragma: private");
493 0 : header("Cache-control: private, must-revalidate");
494 0 : header("Content-Type: $mimetype");
495 0 : header("Content-Disposition: attachment; filename=\"".$file->orig_filename."\"");
496 0 : header("Content-Transfer-Encoding: binary");
497 0 : header("Content-Length: ".$file->size);
498 : //die datei senden
499 0 : readfile($filename);
500 0 : return "";
501 : }
502 :
503 : /**
504 : * FW
505 : * Prüft ob eine Datei in der DB auch auf
506 : * der Platte vorhanden ist.
507 : *
508 : * @param
509 : * @access public
510 : */
511 : public function testDeadFilesInFolder() {
512 0 : global $settings, $db;
513 0 : $deadFiles = array();
514 : // Verzeichnis dass die hochgeladenen Dateien enthält
515 0 : $uploadDir = PATH_TO_ROOT.$settings["upload_path"].'filemanager/courseID/'.$_SESSION['course'];
516 0 : $filesInCourseDb = $db->get_results(
517 : "SELECT link FROM filelist WHERE courseID='"
518 0 : .$_SESSION['course']."' and type = 'file'"
519 0 : );
520 :
521 0 : foreach($filesInCourseDb as $fileCourse) {
522 0 : $filesInDB[] = (string)$fileCourse->link;
523 0 : }
524 :
525 : //Einlesen der Dateien in Array
526 0 : if($uploadOpen=opendir($uploadDir)) {
527 0 : while($file=readdir($uploadOpen)) {
528 0 : if ($file != "." && $file != ".." && !is_dir($uploadDir ."/". $file)) {
529 0 : if(!(in_array($file,$filesInDB))){
530 0 : $deadFiles[]=$file;
531 0 : }
532 0 : }
533 0 : }
534 0 : closedir($uploadOpen);
535 0 : }
536 0 : return $deadFiles;
537 :
538 : }
539 : /**
540 : * Öffnet einen Link in einem neuen Fenster (Gegenstück zu downloadFile für
541 : * Links)
542 : *
543 : * @param int [$fileID] ID des zu öffnenden Links
544 : * @access private
545 : */
546 : public function openLink($fileID) {
547 0 : global $db;
548 0 : if (!$this->canSeeFile($fileID)) {
549 0 : return "Sie haben keine Berechtigung diesen Link zu öffnen!";
550 : }
551 : // Ziel Url ermitteln
552 0 : $link = $db->get_var("SELECT link FROM filelist WHERE fileID='".$fileID."'");
553 : // Zugriff wird geloggt
554 0 : $time = time();
555 0 : $db->query(
556 : "INSERT INTO filelog (userID, fileID, date) VALUES ('".
557 0 : $_SESSION['userid']."','$fileID','$time')"
558 0 : );
559 0 : $db->query("UPDATE filelist SET counter=counter+1 WHERE fileID='$fileID'");
560 0 : if (Utilities::validateURL($link)) header("Location: ".$link);
561 0 : exit();
562 : }
563 : /**
564 : * Ersetzt bestimmte Zeichen mit einem _
565 : *
566 : * @param string [$string] String in dem Zeichen ersetzt werden sollen
567 : * @param string [$special] Ein String mit den SonderZeichen, die ersetzt
568 : * werden sollen
569 : * @return string String mit ersetzten Zeichen
570 : * @access private
571 : */
572 : private function replaceSpecialChars($string, $special) {
573 0 : $strlen = strlen($special);
574 0 : for ($i = 0 ; $i <= $strlen ; $i++) {
575 0 : $char = substr($special, $i, 1);
576 0 : $string = str_replace($char, "_", $string);
577 0 : $string = str_replace("__", "_", $string);
578 0 : }
579 0 : $string = str_replace("__", "_", $string);
580 0 : return $string;
581 : }
582 : /**
583 : * Ermittelt Sichtbarkeits-/Downloadrechte von Userid auf fileId
584 : *
585 : * @param int [$fileID] Die ID des files (folder/link/file) zum Rechte ermitteln
586 : * @return bool Erfolgswert
587 : * @access private
588 : */
589 : private function canSeeFile($fileID) {
590 : /* Sehen kann man wenn:
591 : - Man Admin/Dozent ist
592 : - Man Besitzer ist
593 : - Tutor und visibleMode=2
594 : - visibleMode=1
595 : - visibleMode aller übergeordneten Ordner != 1
596 : - Explizite User-Berechtigungen vorliegen */
597 0 : global $db;
598 : // Admin oder Dozent
599 0 : if ($_SESSION['usergroup'] == ADMIN || $_SESSION['usergroup'] == DOZENT) return true;
600 0 : $file = $db->get_row(
601 0 : "SELECT courseID, userID, visible_type, parent_object FROM filelist WHERE fileID='$fileID'"
602 0 : );
603 : // Es gibt keine solche Ressource
604 0 : if (!isset($file)) return false;
605 : // Wenn falscher Kurs gleich raus
606 0 : if (is_null($file) || $_SESSION['course'] != $file->courseID && $file->courseID != 0) return false;
607 : // Alle duerfen sehen
608 0 : if ($file->visible_type == 1) {
609 : // nur wenn die Datei nicht in einem für Studenten nicht freigegebenen (Über-)Ordner liegt
610 0 : $parentID = $file->parent_object;
611 0 : while ($parentID != 0) {
612 0 : $parentFolder = $db->get_row(
613 0 : "SELECT visible_type, parent_object FROM filelist WHERE fileID='$parentID'"
614 0 : );
615 0 : if ($parentFolder->visible_type > 1) return false;
616 0 : $parentID = $parentFolder->parent_object;
617 0 : }
618 0 : return true;
619 : }
620 : // Tutor
621 0 : if (isset($_SESSION['assistent']) && $file->visible_type == 2) {
622 : // nur wenn die Datei nicht in einem nur für Dozenten freigegebenen (Über-)Ordner liegt
623 0 : $parentID = $file->parent_object;
624 0 : while ($parentID != 0) {
625 0 : $parentFolder = $db->get_row(
626 0 : "SELECT visible_type, parent_object FROM filelist WHERE fileID='$parentID'"
627 0 : );
628 0 : if ($parentFolder->visible_type == 3) return false;
629 0 : $parentID = $parentFolder->parent_object;
630 0 : }
631 0 : return true;
632 : }
633 : // Besitzer
634 0 : if ($_SESSION['userid'] == $file->userID) return true;
635 : // Einzelberechtigung (gilt nicht, falls ein übergeordneter Ordner eine geringere Sichtbarkeit hat!!)
636 0 : if ($db->get_var(
637 0 : "SELECT count(*) FROM filevisible WHERE fileID='
638 0 : $fileID' AND userID='".$_SESSION['userid']."'"
639 0 : ) > 0) {
640 0 : return true;
641 : }
642 0 : return false;
643 : }
644 :
645 : /**
646 : * Deliver an archive of the given folder.
647 : *
648 : * Depending on the configuration,
649 : * it is possible that a recursive download archive is generated.
650 : *
651 : * @param Integer $folderID
652 : * @param Boolean $recursion (Default = False)
653 : * @return String
654 : */
655 : public function getArchivedFolder($folderID, $recursion = FALSE) {
656 0 : global $resDB;
657 0 : global $settings;
658 :
659 0 : if ($folderID > 0) {
660 0 : $folder = $resDB->getFolderByID($folderID);
661 :
662 0 : if (!$folder instanceof Folder) {
663 0 : return "Ordner mit der ID ".$folderID." wurde nicht gefunden.";
664 : }
665 0 : } elseif ($folderID == -2) {
666 0 : $folder = new Folder(-2);
667 0 : $folder->setLink("Last 20");
668 0 : $folder->setCourseID($_SESSION['course']);
669 0 : $folder->setDescription("Die 20 neuesten Dateien dieses Kurses.");
670 0 : } elseif ($folderID == -1) {
671 0 : $folder = new Folder(-1);
672 0 : $folder->setLink("Top 20");
673 0 : $folder->setCourseID($_SESSION['course']);
674 0 : $folder->setDescription("Die 20 beliebtesten Dateien dieses Kurses.");
675 0 : } elseif ($folderID == 0) {
676 0 : $folder = new Folder(0);
677 0 : $folder->setLink("Hauptordner");
678 0 : $folder->setCourseID($_SESSION['course']);
679 0 : $folder->setDescription("Alle Dateien dieses Kurses.");
680 0 : } else {
681 0 : return "Ordner mit der ID ".$folderID." wurde nicht gefunden.";
682 : }
683 :
684 : try {
685 0 : if (ZipProvider::checkArchiveSize($folder, $recursion) <=
686 0 : $settings['filemanager_archive_max_filesize']*1024*1024) {
687 :
688 0 : $zipProvider = new ZipProvider($folder, $recursion);
689 0 : $zipProvider->createArchive();
690 0 : $zipProvider->sendArchive();
691 0 : }
692 0 : } catch (ArchiverException $e) {
693 : return $e->getMessage();
694 : }
695 :
696 0 : return "";
697 : }
698 : }
|